package com.cool.collect.springcode.a12;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author xiemiao
 * @description
 * @date 2023/09/04
 */
public class CglibProxyDemo {

    static class Target {
        public void foo() {
            System.out.println("target foo");
        }
    }

    // 代理是子类型，目标是父类型
    public static void main(String[] args) {
        Target target = new Target();
        Target proxy = (Target) Enhancer.create(Target.class, new MethodInterceptor() {
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("before");
                // 用方法反射调用目标
                // Object result = method.invoke(target, args);

                // MethodProxy可以避免反射调用
                // Object result = methodProxy.invoke(target, args);  // 内部没有使用反射，需要目标（spring）
                Object result = methodProxy.invokeSuper(proxy, args); // 内部没有使用反射，需要代理
                System.out.println("after");
                return result;
            }
        });

        proxy.foo();
    }
}
